package com.example.plan.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.plan.common.BaseResponse;
import com.example.plan.common.result.Result;
import com.example.plan.model.dto.user.UserQueryRequest;
import com.example.plan.model.dto.user.UserUpdateRequest;
import com.example.plan.model.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.plan.model.vo.UserVo;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
* @author ASUS
* @description 针对表【user(用户表)】的数据库操作Service
* @createDate 2025-03-01 19:07:17
*/
public interface UserService extends IService<User> {



    /**
     * 注册用户的方法。
     *
     * @param userAccount   用户账号
     * @param userPassword  用户密码
     * @param checkPassword 确认密码
     * @return 返回一个长整型值，通常用于表示操作结果的状态码或用户ID
     */
Result<Long> userRegister(String userAccount, String userPassword, String checkPassword);

/**
 * 用户登录的方法。
 *
 * @param userAccount  用户账号
 * @param userPassword 用户密码
 * @param request      HTTP请求对象，用于获取请求相关信息
 * @return 返回一个User对象，包含用户的基本信息
 */
Result<User> userLogin(String userAccount, String userPassword, HttpServletRequest request);

/**
 * 用户登出的方法。
 *
 * @param request HTTP请求对象，用于获取请求相关信息
 * @return
 */
Result<String> logout(HttpServletRequest request);

/**
 * 获取用户信息的方法。
 *
 * @param request HTTP请求对象，用于获取请求相关信息
 * @return 返回一个User对象，包含用户的基本信息
 */
User getUserInfo(HttpServletRequest request);

    /**
     * 分页查询所有用户信息
     *
     * @param request HTTP请求对象，用于获取请求相关信息
     * @return 脱敏后用户信息分页结果
     */
    Result<Page<UserVo>> getAllUsers(HttpServletRequest request);

    /**
     * 获得脱敏后的用户信息
     *
     * @param userQueryRequest 用户查询请求对象，包含分页信息和搜索条件
     * @return 脱敏后的用户信息分页结果
     */
    Result<Page<UserVo>> getUsersByConditions(UserQueryRequest userQueryRequest);

    UserVo getUserVO(User user);

    /**
     * 根据用户列表获取用户视图对象列表
     * @param records 用户列表
     * @return 用户视图对象列表
     */
    List<UserVo> getUserVOList(List<User> records);

    /**
     * 根据用户查询请求获取查询条件包装器
     * @param userQueryRequest 用户查询请求条件参数
     * @return 查询条件包装器
     */
    QueryWrapper getUserQueryWrapper(UserQueryRequest userQueryRequest);

    /**
     * 修改用户
     *
     * @param userUpdateRequest 用户更新请求对象
     * @return 更新后的用户信息
     */
    Result<UserVo> updateUser(UserUpdateRequest userUpdateRequest);

    /**
     * 删除用户
     *
     * @param id 用户ID
     * @return 是否删除成功
     */
    Result<Boolean> deleteUser(Long id);

    /**
     * 更新用户密码
     *
     * @param userId      用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 更新结果
     */
    Result<Boolean> updateUserPassword(Long userId, String oldPassword, String newPassword);

    /**
     * 重置用户密码
     *
     * @param userId      用户ID
     * @param newPassword 新密码
     * @return 更新结果
     */
    Result<Boolean> resetUserPassword(Long userId, String newPassword);

    /**
     * 恢复用户
     *
     * @param userId 用户ID
     * @return 恢复结果
     */
    BaseResponse<Boolean> recoverUser(Long userId);


    /**
     * 导出用户数据
     *
     * @return 用户数据列表
     */
    Result<List<UserVo>> exportUsers();

    /**
     * 导入用户数据
     *
     * @param users 用户数据列表
     * @return 导入结果
     */
    Result<Boolean> importUsers(List<User> users);


}
